/*
 * ZarzadzaniePacjentami.java
 *
 * Created on 2011-04-03, 20:07:50
 * 
 */
package medimg.widok.pacjenci;

import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import medimg.scheme.Pacjenci;
import medimg.scheme.Badania;
import medimg.scheme.Zdjecia;
import medimg.scheme.RodzajBadan;
import org.hibernate.JDBCException;
import org.hibernate.Session;

/**
 * Reprezentuje okno badania pacjentow.
 * @author PSI
 */
public class BadaniaPacjentow extends javax.swing.JDialog {

    private DefaultListModel listModelPacjenci,listModelBadania,listModelZdjecia;
    private Pacjenci bierzacyPacjent;
    private Badania bierzaceBadanie;
    private Zdjecia bierzaceZdjecie;

    ArrayList<Badania> badaniaArray=null;
    ArrayList<RodzajBadan> rodzajArray=null;
    /**Tworzy nowe okno ZarzadzaniePacjentami */
    public BadaniaPacjentow(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        listModelPacjenci = new DefaultListModel();
        listModelBadania = new DefaultListModel();
        listModelZdjecia = new DefaultListModel();
        jListPacjenci.setModel(listModelPacjenci);
        jListBadania.setModel(listModelBadania);
        jListPliki.setModel(listModelZdjecia);
        this.setLocationRelativeTo(parent);
        zaladujPacjentow();
        jButtonUsunPlik.setEnabled(false);
        this.setLocationRelativeTo(parent);
        // TODO zaladowanie wszystkich badan na liste
    }

    /**
     *  Laduje pacjentow z bazy
     */
    public void zaladujPacjentow(){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        listModelPacjenci.removeAllElements();
        ArrayList<Pacjenci> pacjenciArray=null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        Pacjenci pacjent=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            pacjenciArray = new ArrayList<Pacjenci>(session.createQuery("from Pacjenci").list());
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        if(pacjenciArray != null && !pacjenciArray.isEmpty()){

            for(Pacjenci pac:pacjenciArray){
               listModelPacjenci.addElement(pac.getPesel());
            }
        }
        else{ //jesli nie to MB
             JOptionPane.showConfirmDialog(this,"Nie pobrano zadnych danych.","Brak danych",JOptionPane.DEFAULT_OPTION);
        }
    }

    /**
     *  Laduje badania pacjenta z bazy.
     * @param pacjent ktorego badania maja byc zaladowane
     */
    public void zaladujBadania(Pacjenci pacjent){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        listModelBadania.removeAllElements();
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        Badania badanie=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            badaniaArray = new ArrayList<Badania>(session.createQuery("from Badania where pacjent="+pacjent.getId()).list());
            rodzajArray = new ArrayList<RodzajBadan>(session.createQuery("from RodzajBadan").list());
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        if(badaniaArray != null && !badaniaArray.isEmpty()){

            for(Badania bad:badaniaArray){
                for(RodzajBadan rodz:rodzajArray){
                    if(bad.getRodzaj()==rodz.getId())
                        listModelBadania.addElement(rodz.getNazwa());
                }
            }
        }
        else{ //jesli nie to MB
             JOptionPane.showConfirmDialog(this,"Nie pobrano zadnych danych.","Brak danych",JOptionPane.DEFAULT_OPTION);
        }
    }

    /**
     *  Laduje zdjecia z bazy
     * @param badanie ktorego zdjecia maja byc zaladowane
     */
    public void zaladujZdjecia(Badania badanie){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        listModelZdjecia.removeAllElements();
        ArrayList<Zdjecia> zdjeciaArray=null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        Zdjecia zdjecie=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            zdjeciaArray = new ArrayList<Zdjecia>(session.createQuery("from Zdjecia where badanie="+badanie.getId()).list());
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        if(zdjeciaArray != null && !zdjeciaArray.isEmpty()){

            for(Zdjecia zdj:zdjeciaArray){
               listModelZdjecia.addElement(zdj.getNazwaPliku());
            }
        }
        else{ //jesli nie to MB
             JOptionPane.showConfirmDialog(this,"Nie pobrano zadnych danych.","Brak danych",JOptionPane.DEFAULT_OPTION);
        }
    }

    /**
     *  Odczyt danych pacjenta, jesli cos odczytano to ladowanie ich
     * @param pacjent ktorego badanie ma byc odczytane
     */
    private void odczytPacjenta(Pacjenci pacjent){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        ArrayList<Pacjenci> pacjenciArray=null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        pacjent=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            pacjent =(Pacjenci) (session.createQuery("from Pacjenci where pesel="+jListPacjenci.getSelectedValue()).uniqueResult());
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
        if(pacjent != null){
                zaladujBadania(pacjent);
        }
        else{
            JOptionPane.showConfirmDialog(this,"Problem z pobraniem danych.","Blad",JOptionPane.DEFAULT_OPTION);
        }
        bierzacyPacjent = pacjent;
    }

    /**
     *  Laduje badania pacjenta z bazy.
     * @param badania ktore maja byc przeczytane dla pacjenta
     */
    private void odczytBadania(Badania badanie){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        boolean znalazlem = false;
        RodzajBadan rodzaj;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        badanie=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            //poprawic zapytanie

            for(Badania bad:badaniaArray){
                for(RodzajBadan rodz:rodzajArray){
                    if(rodz.getNazwa()==jListBadania.getSelectedValue() && bad.getRodzaj()==rodz.getId())
                        badanie =(Badania) (session.createQuery("from Badania where id="+bad.getId()).uniqueResult());
                }
            }
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
        if(badanie != null){
                zaladujZdjecia(badanie);
        }
        else{
            JOptionPane.showConfirmDialog(this,"Problem z pobraniem danych (odczytBadania).","Blad",JOptionPane.DEFAULT_OPTION);
        }
        bierzaceBadanie = badanie;
    }

     /**
     *  Odczytuje zdjecia z bazy danych.
     * @param zdjecie ktore ma byc odczytane z bazy
     */
    private void odczytZdjecia(Zdjecia zdjecie){
        if(!medimg.hibernate.HibernateUtil.isOpen()){
            JOptionPane.showConfirmDialog(this,"Najpierw podłącz się do bazy.","Nie polaczono",JOptionPane.DEFAULT_OPTION);
            return;
        }
        ArrayList<Zdjecia> zdjeciaArray=null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        zdjecie=null;
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            zdjecie =(Zdjecia) (session.createQuery("from Zdjecia where nazwa_pliku ='"+jListPliki.getSelectedValue()+"'").uniqueResult());
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
        if(zdjecie != null){
                //TO DO co sie ma wydarzyc ?
        }
        else{
            JOptionPane.showConfirmDialog(this,"Problem z pobraniem danych (odczyt Zdjecia).","Blad",JOptionPane.DEFAULT_OPTION);
        }
        bierzaceZdjecie = zdjecie;
    }

    /**
     * Filtrowanie listy wg zadanego filtru.
     * @param filtr
     * @param model listy
     */
    private void filtrujListe(String filtr, DefaultListModel model){
        if(filtr.length() == 0){ //jesli filtr pusty to przywroc stary model ktory zawiera wszystkie rekordy
            jListPacjenci.setModel(model);
        }else{
            DefaultListModel newModel = new DefaultListModel();
            for(int i=0; i<model.getSize();i++){
                //jesli znaleziony filtr jest na poczatku napisu to dodaj do nowego modelu
                if(model.getElementAt(i).toString().indexOf(filtr) == 0)
                    newModel.addElement(model.getElementAt(i));
            }
            jListPacjenci.setModel(newModel);
        }

    }

    /**
     * Usuwa zdjecie z bazy
     * @param zdjecie do usuniecia
     */
    private void usunZdjecie(Zdjecia zdjecie){
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        try{
            session.beginTransaction(); //rozpoczecie transakcji
            session.delete(zdjecie);
            session.getTransaction().commit();
        }
        catch(JDBCException ex){
             session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jListPacjenci = new javax.swing.JList();
        jButtonOk = new javax.swing.JButton();
        jButtonUsunPlik = new javax.swing.JButton();
        jTextFieldFiltr = new javax.swing.JTextField();
        jLabelFiltr = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jListPliki = new javax.swing.JList();
        jScrollPane3 = new javax.swing.JScrollPane();
        jListBadania = new javax.swing.JList();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Badania pacjentów");
        setModal(true);
        setName("BadaniaPacjentow"); // NOI18N
        setResizable(false);

        jListPacjenci.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Bartoszek Maciej", "Hajduk Paweł", "Kołodziejczyk Bartłomiej", "Kowalczyk Marek", "Szmandra Marek" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jListPacjenci.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jListPacjenciMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(jListPacjenci);

        jButtonOk.setText("OK");
        jButtonOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonOkActionPerformed(evt);
            }
        });

        jButtonUsunPlik.setText("Usuń");
        jButtonUsunPlik.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonUsunPlikActionPerformed(evt);
            }
        });

        jTextFieldFiltr.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTextFieldFiltrKeyReleased(evt);
            }
        });

        jLabelFiltr.setText("Filtr");

        jListPliki.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Plik1", "Plik2", "Plik3" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jListPliki.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jListPlikiMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(jListPliki);

        jListBadania.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Badanie <data>", "Badanie <data>", "Badanie <data>", "Badanie <data>", "Badanie <data>", "Badanie <data>", "Badanie <data>" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jListBadania.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jListBadaniaMouseClicked(evt);
            }
        });
        jScrollPane3.setViewportView(jListBadania);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelFiltr)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jTextFieldFiltr, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButtonUsunPlik)
                        .addGap(95, 95, 95))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addContainerGap())
                        .addGroup(layout.createSequentialGroup()
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 95, Short.MAX_VALUE)
                            .addComponent(jButtonOk)
                            .addContainerGap()))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jScrollPane2)
                    .addComponent(jScrollPane3)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabelFiltr)
                            .addComponent(jTextFieldFiltr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButtonUsunPlik)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButtonOk)
                .addContainerGap())
        );

        getAccessibleContext().setAccessibleParent(null);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonOkActionPerformed
        this.dispose();
    }//GEN-LAST:event_jButtonOkActionPerformed

    private void jButtonUsunPlikActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonUsunPlikActionPerformed
        usunZdjecie(bierzaceZdjecie);
        zaladujZdjecia(bierzaceBadanie);
        jButtonUsunPlik.setEnabled(false);
    }//GEN-LAST:event_jButtonUsunPlikActionPerformed

    private void jListPacjenciMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jListPacjenciMouseClicked
        odczytPacjenta(bierzacyPacjent);
        jButtonUsunPlik.setEnabled(false);
        listModelZdjecia.removeAllElements();
    }//GEN-LAST:event_jListPacjenciMouseClicked

    private void jListBadaniaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jListBadaniaMouseClicked
        odczytBadania(bierzaceBadanie);
        jButtonUsunPlik.setEnabled(false);
    }//GEN-LAST:event_jListBadaniaMouseClicked

    private void jListPlikiMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jListPlikiMouseClicked
        jButtonUsunPlik.setEnabled(true);
        odczytZdjecia(bierzaceZdjecie);
        
    }//GEN-LAST:event_jListPlikiMouseClicked

    private void jTextFieldFiltrKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldFiltrKeyReleased
         filtrujListe(jTextFieldFiltr.getText(), listModelPacjenci);
    }//GEN-LAST:event_jTextFieldFiltrKeyReleased

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                ZarzadzaniePacjentami dialog = new ZarzadzaniePacjentami(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonOk;
    private javax.swing.JButton jButtonUsunPlik;
    private javax.swing.JLabel jLabelFiltr;
    private javax.swing.JList jListBadania;
    private javax.swing.JList jListPacjenci;
    private javax.swing.JList jListPliki;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTextField jTextFieldFiltr;
    // End of variables declaration//GEN-END:variables
}
